package cn.txun.csmall.all.adapter.impl;



import cn.txun.csmall.all.adapter.mapper.OrderMapper;
import cn.txun.csmall.all.service.ICartService;
import cn.txun.csmall.all.service.IOrderService;
import cn.txun.csmall.all.service.IStockService;
import cn.txun.csmall.commons.exception.CoolSharkServiceException;
import cn.txun.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.txun.csmall.commons.pojo.order.entity.Order;
import cn.txun.csmall.commons.pojo.stock.dto.StockReduceCountDTO;
import cn.txun.csmall.commons.restful.JsonPage;
import cn.txun.csmall.commons.restful.ResponseCode;
import com.alibaba.csp.sentinel.annotation.SentinelResource;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

@DubboService
// order模块是具备生产者特征的,它会被business模块调用,所以也要加@DubboService注解
@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {
    @Autowired
    private OrderMapper orderMapper;

    @DubboReference(loadbalance = "random")
    private IStockService stockService;

    @Autowired
    private RpcCartService rpcCartService;

    @Override
    public void orderAdd(OrderAddDTO orderAddDTO) {
        //Reduce  stock
        StockReduceCountDTO countDTO=new StockReduceCountDTO();
        countDTO.setCommodityCode(orderAddDTO.getCommodityCode());
        countDTO.setReduceCount(orderAddDTO.getCount());
        // 利用Dubbo调用stock模块减少库存的业务逻辑层方法实现功能
        stockService.reduceCommodityCount(countDTO);

        //add order
        Order order=new Order();
        BeanUtils.copyProperties(orderAddDTO,order);
        orderMapper.insertOrder(order);
        log.info("新增订单信息为:{}",order);
        //delete cart
        rpcCartService.rpcCartDelete(orderAddDTO.getUserId(),orderAddDTO.getCommodityCode());
    }



    // 分页查询所有订单的业务逻辑层方法
    // page是页码,pageSize是每页条数
    public JsonPage<Order> getAllOrdersByPage(Integer page, Integer pageSize){
        // PageHelper框架实现分页的核心操作:
        // 在要执行分页的查询运行之前,设置分页的条件
        // 设置的方式如下(固定的格式,PageHelper框架设计的)
        // PageHelper设置page为1就是查询第一页
        PageHelper.startPage(page,pageSize);
        // 下面开始持久层方法的调用
        // 此方法运行时因为上面设置了分页条件,sql语句中会自动出现limit关键字
        List<Order> list = orderMapper.findAllOrders();
        // 查询结果list中包含的就是分页查询范围的数据了
        // 但是这个数据不包含分页信息(总页数,总条数,是否是首页,是否是末页等)
        // 我们要利用PageHelper框架提供的PageInfo类型,来进行返回
        // PageInfo对象可以既包含分页数据,又包含分页信息
        // 这些信息会在PageInfo对象实例化时自动计算,并赋值到PageInfo对象中
        return JsonPage.restPage(new PageInfo<>(list));
    }



}







